﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace VideoLink.Streams
{
    /// <summary>
    /// Представляет собой полосу, показывающую процент выполнения работы.
    /// </summary>
    public partial class CoolProgressBar : UserControl
    {
        #region Private fields

        private int maxValue = 100;
        private int progress = 0;

        private Brush rectBrush;
        private Brush textBrush;
        private Font percentFont;
        private Pen borderPen;

        #endregion

        #region Public properties

        /// <summary>
        /// Значение прогресса, соответствующее сделанной работе 
        /// </summary>
        public int MaxValue
        {
            get { return maxValue; }
            set
            {
                if (value < 0)
                    return;
                maxValue = value;
                Refresh();
            }
        }

        /// <summary>
        /// Количество сделанной работы
        /// </summary>
        public int Progress
        {
            get { return progress; }
            set
            {
                if ((progress < 0) ||
                    (progress > maxValue))
                    return;
                progress = value;
                Refresh();
            }
        }
        
        /// <summary>
        /// Кисть, которой закрашивается область, соответствующая выполненной работе
        /// </summary>
        public Brush RectBrush
        {
            get { return rectBrush; }
            set { rectBrush = value; Refresh(); }
        }

        /// <summary>
        /// Ксить, которой рисуется текст
        /// </summary>
        public Brush PercentBrush
        {
            get { return textBrush; }
            set { textBrush = value; Refresh(); }
        }

        /// <summary>
        /// Шрифт, которым рисуется текст
        /// </summary>
        public Font PercentFont
        {
            get { return percentFont; }
            set { percentFont = value; Refresh(); }
        }

        /// <summary>
        /// Ручка, которой рисуется граница контрола
        /// </summary>
        public Pen BorderPen
        {
            get { return borderPen; }
            set { borderPen = value; Refresh(); }
        }

        #endregion
        
        /// <summary>
        /// Создать экземпляр класса по умолчанию
        /// </summary>
        public CoolProgressBar()
        {
            InitializeComponent();

            SetStyle(ControlStyles.UserPaint
                    | ControlStyles.AllPaintingInWmPaint
                    | ControlStyles.OptimizedDoubleBuffer
                    | ControlStyles.ResizeRedraw,
                true);

            var baseColor = Color.FromArgb(141, 198, 255);
            rectBrush = new SolidBrush(baseColor);
            textBrush = new SolidBrush(Color.DarkBlue);
            percentFont = new Font(FontFamily.GenericSansSerif, 25);
            borderPen = null;//new Pen(Color.DarkBlue, 0);
        }

        private void CoolProgressBar_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            var rectHeight = (int)Math.Round(Height * (1.0 * progress / maxValue));
            e.Graphics.FillRectangle(rectBrush,
                0,
                Height - rectHeight,
                Width,
                rectHeight);

            var text = ((progress * 100) / maxValue).ToString() + "%";
            e.Graphics.DrawString(text,
                percentFont,
                textBrush,
                Width / 2 - text.Length * percentFont.SizeInPoints / 3,
                Height / 2 - percentFont.SizeInPoints);

            
            if (borderPen != null)
                e.Graphics.DrawRectangle(borderPen,
                    0,
                    0,
                    Width - 2,
                    Height - 2);
        }
    }
}
